fn main() {
    println!("Hello, world!");
    //计算一个长方形面积


    //struct 的方法

    let rect = Rectangle{
        width:50,
        height:30,
    };

    let rect1 = Rectangle{
        width:40,
        height:30,
    };

    let rect2 = Rectangle{
        width:50,
        height:80,
    };
    let area = rect.area();

    println!("{}",rect.can_hold(&rect1));
    println!("{}",rect.can_hold(&rect2));
    println!("{}",area);

    //结构体的关联函数,跟实例没有关系
    let s = Rectangle::square(100);
    println!("{}",s.area());
    println!("{:#?}",rect);
    println!("{:#?}",s);
}


#[derive(Debug)]
struct Rectangle{
    width:u32,
    height:u32,
}


impl Rectangle {
    //第一个方法,计算面积
    fn area(&self)->u32 {
        self.width*self.height
    }

    //第二个方法,一个长方形是否可以容纳另一个长方形
    fn can_hold(&self,other:&Rectangle)->bool {
        self.width >= other.width && self.height >= other.height
    }
}

//关联函数不将self作为第一个参数,方法是把self作为第一个参数,
//函数跟实例没有关系跟静态方法一样的::


//每个struct 允许拥有多个impl块
impl Rectangle {
    fn square(size :u32)->Rectangle {
        Rectangle{
            width:size,
            height:size
        }
    }
}
